From 7014ef00329ee58c9de30ea7e45eebc191498a00 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 27 Nov 2005 20:36:15 +0000 Subject: [PATCH] =?utf8?q?Fix=20two=20memory=20handling=20problems=20in=20?= =?utf8?q?GtkTreeView:=20(#322350,=20S=C3=B8ren?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 2005-11-27 Matthias Clasen Fix two memory handling problems in GtkTreeView: (#322350, Søren Sandmann) * gtk/gtktreeview.c (gtk_tree_view_destroy) (gtk_tree_view_set_model): Remove all references to nodes in the old model. (gtk_tree_view_real_collapse_row): Unmark expanded_collapsed_node before removing the children. --- ChangeLog | 9 +++++++++ ChangeLog.pre-2-10 | 9 +++++++++ gtk/gtktreeview.c | 44 +++++++++++++++++++++++++------------------- 3 files changed, 43 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5e66352151..92b773037c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2005-11-27 Matthias Clasen + Fix two memory handling problems in GtkTreeView: (#322350, + Søren Sandmann) + + * gtk/gtktreeview.c (gtk_tree_view_destroy) + (gtk_tree_view_set_model): Remove all references to nodes in + the old model. + (gtk_tree_view_real_collapse_row): Unmark expanded_collapsed_node + before removing the children. + * gtk/gtkcolorbutton.c (gtk_color_button_init): Don't leak a PangoLayout here. (#322505, Paolo Borelli) diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 5e66352151..92b773037c 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,5 +1,14 @@ 2005-11-27 Matthias Clasen + Fix two memory handling problems in GtkTreeView: (#322350, + Søren Sandmann) + + * gtk/gtktreeview.c (gtk_tree_view_destroy) + (gtk_tree_view_set_model): Remove all references to nodes in + the old model. + (gtk_tree_view_real_collapse_row): Unmark expanded_collapsed_node + before removing the children. + * gtk/gtkcolorbutton.c (gtk_color_button_init): Don't leak a PangoLayout here. (#322505, Paolo Borelli) diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index baa2386235..fac7393a34 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -1313,6 +1313,20 @@ gtk_tree_view_finalize (GObject *object) /* GtkObject Methods */ +static void +gtk_tree_view_free_rbtree (GtkTreeView *tree_view) +{ + _gtk_rbtree_free (tree_view->priv->tree); + + tree_view->priv->tree = NULL; + tree_view->priv->button_pressed_node = NULL; + tree_view->priv->button_pressed_tree = NULL; + tree_view->priv->prelight_tree = NULL; + tree_view->priv->prelight_node = NULL; + tree_view->priv->expanded_collapsed_node = NULL; + tree_view->priv->expanded_collapsed_tree = NULL; +} + static void gtk_tree_view_destroy (GtkObject *object) { @@ -1337,8 +1351,8 @@ gtk_tree_view_destroy (GtkObject *object) if (tree_view->priv->tree != NULL) { gtk_tree_view_unref_and_check_selection_tree (tree_view, tree_view->priv->tree); - _gtk_rbtree_free (tree_view->priv->tree); - tree_view->priv->tree = NULL; + + gtk_tree_view_free_rbtree (tree_view); } if (tree_view->priv->selection != NULL) @@ -9464,15 +9478,7 @@ gtk_tree_view_set_model (GtkTreeView *tree_view, tree_view->priv->model); if (tree_view->priv->tree) - { - _gtk_rbtree_free (tree_view->priv->tree); - tree_view->priv->tree = NULL; - } - - tree_view->priv->prelight_node = NULL; - tree_view->priv->prelight_tree = NULL; - tree_view->priv->button_pressed_node = NULL; - tree_view->priv->button_pressed_tree = NULL; + gtk_tree_view_free_rbtree (tree_view); gtk_tree_row_reference_free (tree_view->priv->drag_dest_row); tree_view->priv->drag_dest_row = NULL; @@ -10966,6 +10972,14 @@ gtk_tree_view_real_collapse_row (GtkTreeView *tree_view, gtk_tree_path_free (lsc); } + if (tree_view->priv->expanded_collapsed_node != NULL) + { + GTK_RBNODE_UNSET_FLAG (tree_view->priv->expanded_collapsed_node, GTK_RBNODE_IS_SEMI_EXPANDED); + GTK_RBNODE_UNSET_FLAG (tree_view->priv->expanded_collapsed_node, GTK_RBNODE_IS_SEMI_COLLAPSED); + + tree_view->priv->expanded_collapsed_node = NULL; + } + if (gtk_tree_view_unref_and_check_selection_tree (tree_view, node->children)) { _gtk_rbtree_remove (node->children); @@ -10980,14 +10994,6 @@ gtk_tree_view_real_collapse_row (GtkTreeView *tree_view, tree_view->priv->expand_collapse_timeout = 0; } - if (tree_view->priv->expanded_collapsed_node != NULL) - { - GTK_RBNODE_UNSET_FLAG (tree_view->priv->expanded_collapsed_node, GTK_RBNODE_IS_SEMI_EXPANDED); - GTK_RBNODE_UNSET_FLAG (tree_view->priv->expanded_collapsed_node, GTK_RBNODE_IS_SEMI_COLLAPSED); - - tree_view->priv->expanded_collapsed_node = NULL; - } - if (animate) { tree_view->priv->expand_collapse_timeout = g_timeout_add (50, expand_collapse_timeout, tree_view); -- 2.30.2